#####################################################
# CCache.cmake - ccache 配置模块
# 
# 自动检测并配置 ccache 来加速 C/C++ 编译
# 支持可选启用/禁用和详细输出
#####################################################

# 选项：允许用户控制是否启用 ccache
option(USE_CCACHE "使用 ccache 加速编译" ON)

# 选项：是否显示详细的 ccache 信息
option(CCACHE_VERBOSE "显示 ccache 详细信息" ON)

# 选项：是否在编译前后显示 ccache 统计信息
option(CCACHE_STATS "在编译前后显示 ccache 统计信息" ON)

function(setup_ccache)
    message(STATUS "USE_CCACHE: ${USE_CCACHE}")
    message(STATUS "CCACHE_VERBOSE: ${CCACHE_VERBOSE}")

    if(NOT USE_CCACHE)
        if(CCACHE_VERBOSE)
            message(STATUS "ccache: 已通过 USE_CCACHE=OFF 禁用")
        endif()
        return()
    endif()

    # 查找 ccache 可执行文件
    find_program(CCACHE_PROGRAM ccache)
    
    if(CCACHE_PROGRAM)
        if(CCACHE_VERBOSE)
            message(STATUS "ccache: 找到 ccache 程序: ${CCACHE_PROGRAM}")
            
            # 获取 ccache 版本
            execute_process(
                COMMAND ${CCACHE_PROGRAM} --version
                OUTPUT_VARIABLE CCACHE_VERSION_OUTPUT
                ERROR_QUIET
                OUTPUT_STRIP_TRAILING_WHITESPACE
            )
            
            if(CCACHE_VERSION_OUTPUT)
                string(REGEX MATCH "ccache version ([0-9]+\\.[0-9]+)" CCACHE_VERSION_MATCH ${CCACHE_VERSION_OUTPUT})
                if(CMAKE_MATCH_1)
                    message(STATUS "ccache: 版本 ${CMAKE_MATCH_1}")
                endif()
            endif()
            
            # 获取 ccache 统计信息
            execute_process(
                COMMAND ${CCACHE_PROGRAM} -s
                OUTPUT_VARIABLE CCACHE_STATS_OUTPUT
                ERROR_QUIET
                OUTPUT_STRIP_TRAILING_WHITESPACE
            )
            
            if(CCACHE_STATS_OUTPUT)
                message(STATUS "ccache: 当前统计信息:")
                message(STATUS "${CCACHE_STATS_OUTPUT}")
            endif()
        endif()
        
        # 为 C 和 C++ 编译器设置 ccache
        set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}" PARENT_SCOPE)
        set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}" PARENT_SCOPE)
        
        message(STATUS "ccache: 已启用 ccache 编译缓存")
        
        # 设置一些有用的 ccache 环境变量
        set(ENV{CCACHE_SLOPPINESS} "file_macro,locale,time_macros")
        set(ENV{CCACHE_COMPRESS} "true")
        set(ENV{CCACHE_COMPRESSLEVEL} "6")
        
        if(CCACHE_VERBOSE)
            message(STATUS "ccache: 设置环境变量:")
            message(STATUS "  CCACHE_SLOPPINESS=file_macro,locale,time_macros")
            message(STATUS "  CCACHE_COMPRESS=true")
            message(STATUS "  CCACHE_COMPRESSLEVEL=6")
        endif()
        
    else()
        if(CCACHE_VERBOSE)
            message(WARNING "ccache: 未找到 ccache 程序，编译将不使用缓存")
        else()
            message(STATUS "ccache: 未找到，跳过缓存配置")
        endif()
    endif()
endfunction()

# 重置 ccache 统计信息（编译开始前调用）
function(reset_ccache_stats)
    if(USE_CCACHE AND CCACHE_STATS AND CCACHE_PROGRAM)
        message(STATUS "")
        message(STATUS "=== 重置 ccache 统计信息 ===")
        execute_process(
            COMMAND ${CCACHE_PROGRAM} -z
            OUTPUT_VARIABLE CCACHE_RESET_OUTPUT
            ERROR_QUIET
            OUTPUT_STRIP_TRAILING_WHITESPACE
        )
        message(STATUS "ccache: 统计信息已重置")
        message(STATUS "==============================")
        message(STATUS "")
    endif()
endfunction()

# 显示 ccache 最终统计信息（编译结束后调用）
function(show_ccache_final_stats)
    if(USE_CCACHE AND CCACHE_STATS AND CCACHE_PROGRAM)
        message(STATUS "")
        message(STATUS "=== ccache 编译统计报告 ===")
        execute_process(
            COMMAND ${CCACHE_PROGRAM} -s
            OUTPUT_VARIABLE CCACHE_FINAL_STATS
            ERROR_QUIET
            OUTPUT_STRIP_TRAILING_WHITESPACE
        )
        
        if(CCACHE_FINAL_STATS)
            message(STATUS "${CCACHE_FINAL_STATS}")
        else()
            message(STATUS "无法获取 ccache 统计信息")
        endif()
        message(STATUS "=============================")
        message(STATUS "")
    endif()
endfunction()

# 添加一个函数来显示 ccache 使用提示
function(print_ccache_usage_tips)
    if(USE_CCACHE AND CCACHE_PROGRAM)
        message(STATUS "")
        message(STATUS "=== ccache 使用提示 ===")
        message(STATUS "查看缓存统计: ccache -s")
        message(STATUS "清空缓存: ccache -C")
        message(STATUS "设置缓存大小: ccache -M 5G")
        message(STATUS "查看配置: ccache -p")
        message(STATUS "重新配置项目时使用 -DUSE_CCACHE=OFF 可禁用 ccache")
        message(STATUS "使用 -DCCACHE_VERBOSE=ON 可查看详细的 ccache 信息")
        message(STATUS "使用 -DCCACHE_STATS=OFF 可禁用编译前后的统计显示")
        message(STATUS "========================")
        message(STATUS "")
    endif()
endfunction()
